/**
 * N在5000，需要一个平方的算法。
 * 令 Ui 是以i结尾的最长合法序列的数量，
 * Vi是以i结尾的合法的序列的最长长度（用段数表示，每一段都有K个数字）
 * 令 Di 是到i未知最长的数量，Li是到i为止最长长度
 * 显然 Li = max(Vi, L[i - 1])
 *      D[i - 1]        if V[i] < L[i - 1]
 * Di = U[i]            if V[i] > L[i - 1]
 *      D[i - 1] + U[i] if V[i] == L[i - 1]
 * 
 * 接下来考虑U和V的算法, 对i位置之前的每一个位置j，且Aj==Ai
 * ............j............i
 * 假设[j...i]恰好有K个Ai, 则 Vi = L[j - 1] + 1, 刚好多了一段
 * 然后只需要处理 ......u....j.....i (u, j]之间的等于Ai的位置即可
 * u是距离j最近的满足 L[u-1] != L[j - 1] 的位置
 * 对这段区间中的每个位置p, 假设[p...i]之间一共有t个Ai，只需选出K个构成最后一段即可
 * 但是要注意p必须选、i必须选，因此一共有 C(t-2, K-2) 种选法
 * 所以 Ui = SIGMA{D[p-1]*C(t-2, K-2), 每个合法的p位置}
 * 到此 UVDL 都能算出
 * 最后答案是D[N]
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

llt const MOD = 1000000000 + 7;

vector<vector<llt>> C;

void init(){
    int const sz = 5020;
    C.assign(sz, vector<llt>(sz, 0));
    C[0][0] = 1;
    for(int i=1;i<sz;++i){
        C[i][0] = C[i][i] = 1;
        for(int j=1;j<i;++j){
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
        }
    }
    return;
}

int N, K;
vi A;

vector<llt> U, D;
vi V, L;

int proc(){
    if(1 == K) return 1;
    D.assign(N + 1, 0LL);
    U.assign(N + 1, 0LL);
    V.assign(N + 1, 0);
    L.assign(N + 1, 0);
    D[0] = U[0] = 1;
    /// 这里要从1开始, 不能从K开始, why?
    for(int i=1;i<=N;++i){
        const auto & ai = A[i];
        int match = 0;
        for(int j=i;j>=0;--j){
            if(ai != A[j]) continue;

            ++match;
            if(match == K){
                V[i] = L[j - 1] + 1;
            }
            if(match >= K){
                if(L[j - 1] + 1 < V[i]) break;

                (U[i] += D[j - 1] * C[match - 2][K - 2] % MOD) %= MOD;
            }
        }
        
        L[i] = max(V[i], L[i - 1]);
        if(V[i] == L[i - 1]){
            D[i] = (U[i] + D[i - 1]) % MOD;
        }else if(V[i] > L[i - 1]){
            D[i] = U[i];
        }else{
            D[i] = D[i - 1];
        }
    }
    if(0 == L[N]) return 1;
    return D[N];
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    init();
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N >> K;
        A.assign(N + 1, 0);
        for(int i=1;i<=N;++i) cin >> A[i];
        cout << proc() << endl;
    }
    return 0;
}